# coding=utf-8
import os

# 要生成list [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]可以用list(range(1, 11)):
array = list(range(1, 11))
print(array)

# 如果要生成[1x1, 2x2, 3x3, ..., 10x10]怎么做？方法一是循环：
L = []
for x in range(1, 11):
    L.append(x * x)
print(L)

# 但是循环太繁琐，而列表生成式则可以用一行语句代替循环生成上面的list：
array = [x * x for x in range(1, 11)]
print(array)
# 写列表生成式时，把要生成的元素x * x放到前面，后面跟for循环，就可以把list创建出来，十分有用。

# for循环后面还可以加上if判断，这样我们就可以筛选出仅偶数的平方
array = [x * x for x in range(1, 11) if x % 2 == 0]
print(array)

# 还可以使用两层循环，可以生成全排列：
array = [m + n for m in 'ABC' for n in 'XYZ']
print(array)

# 运用列表生成式，可以写出非常简洁的代码。例如，列出当前目录下的所有文件和目录名，可以通过一行代码实现：
file_array = [d for d in os.listdir('../')]
print(file_array)

# for循环其实可以同时使用两个甚至多个变量，比如dict的items()可以同时迭代key和value：
d = {'x': 'A', 'y': 'B', 'z': 'C'}
for key, val in d.items():
    print(key, '=', val)

# 因此，列表生成式也可以使用两个变量来生成list：
array = [k + '=' + v for k, v in d.items()]
print(array)

# 最后把一个list中所有的字符串变成小写：
array = ['Hello', 'World', 'IBM', 'Apple']
array = [s.lower() for s in array]
print(array)

# 小练习：
# 如果list中既包含字符串，又包含整数，由于非字符串类型没有lower()方法，所以列表生成式会报错：
'''
array = ['Hello', 'World', 18, 'Apple', None]
array = [s.lower() for s in array]
print(array)
'''
# 使用内建的isinstance函数可以判断一个变量是不是字符串：
print(isinstance('123', str))
print(isinstance(123, str))
# 请修改列表生成式，通过添加if语句保证列表生成式能正确地执行：
array = ['Hello', 'World', 18, 'Apple', None]
array = [s.lower() for s in array if isinstance(s, str)]
print(array)